package com.onlyxiahui.common.util;

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

/**
 * 
 * Description <br>
 * Date 2019-03-30 17:47:42<br>
 * 
 * @author XiaHui [onlyxiahui@qq.com]<br>
 * @since 1.0.0
 */
public class OnlyLocalDateUtil {
	/**
	 * 日期+时间+毫秒格式（yyyy-MM-dd HH:mm:ss.SSS）
	 */
	public static final String FORMAT_DATE_TIME_MILLISECOND = "yyyy-MM-dd HH:mm:ss.SSS";
	/**
	 * 日期+时间格式（yyy-MM-dd HH:mm:ss）
	 */
	public static final String FORMAT_DATE_TIME = "yyyy-MM-dd HH:mm:ss";
	/**
	 * 日期格式（yyyy-MM-dd不含时分秒）
	 */
	public static final String FORMAT_DATE = "yyyy-MM-dd";
	/**
	 * 时间格式（HH:mm:ss不含日期）
	 */
	public static final String FORMAT_TIME = "HH:mm:ss";

	/**
	 * 
	 * Description 获取当前日期+时间+毫秒<br>
	 * format:yyyy-MM-dd HH:mm:ss.SSS<br>
	 * Date 2019-03-30 17:47:57<br>
	 * 
	 * @return String
	 * @since 1.0.0
	 */
	public static String getCurrentDateTimeMillisecond() {
		return DateTimeFormatter.ofPattern(FORMAT_DATE_TIME_MILLISECOND).format(LocalDateTime.now());
	}

	/**
	 * 
	 * Description 获取当前日期+时间<br>
	 * format:yyyy-MM-dd HH:mm:ss<br>
	 * Date 2019-03-30 17:48:17<br>
	 * 
	 * @return String
	 * @since 1.0.0
	 */
	public static String getCurrentDateTime() {
		return DateTimeFormatter.ofPattern(FORMAT_DATE_TIME).format(LocalDateTime.now());
	}

	/**
	 * 
	 * Description 获取当前时间<br>
	 * format:HH:mm:ss<br>
	 * Date 2019-03-30 17:48:50<br>
	 * 
	 * @return String
	 * @since 1.0.0
	 */
	public static String getCurrentDate() {
		return DateTimeFormatter.ofPattern(FORMAT_DATE).format(LocalDate.now());
	}

	/**
	 * 
	 * Description 获取当前日期<br>
	 * format:yyyy-MM-dd<br>
	 * Date 2019-03-30 17:49:38<br>
	 * 
	 * @return String
	 * @since 1.0.0
	 */
	public static String getCurrentTime() {
		return DateTimeFormatter.ofPattern(FORMAT_TIME).format(LocalTime.now());
	}

	/**
	 * 
	 * Description 获取当前自定义格式时间 <br>
	 * Date 2019-03-30 17:49:54<br>
	 * 
	 * @param format :自定义时间格式
	 * @return String
	 * @since 1.0.0
	 */
	public static String getCurrent(String format) {
		return DateTimeFormatter.ofPattern(format).format(LocalDateTime.now());
	}

	/**
	 * 
	 * Description 将毫秒转为（HH:mm:ss）多少小时：多少分钟：多少秒 <br>
	 * Date 2019-03-30 17:50:10<br>
	 * 
	 * @param time
	 * @return String
	 * @since 1.0.0
	 */
	public static String millisecondToTime(long time) {
		String text = "";
		time = time / 1000L;
		long hour = time / 3600L;
		long minute = (time - hour * 3600L) / 60L;
		long second = time - hour * 3600L - minute * 60L;
		text = (hour > 9 ? hour : ("0" + hour)) + ":" + (minute > 9 ? minute : ("0" + minute)) + ":"
				+ (second > 9 ? second : ("0" + second));
		return text;
	}

	/**
	 * 
	 * Description 字符串日期转LocalDate <br>
	 * Date 2019-03-30 17:50:29<br>
	 * 
	 * @param time
	 * @param format
	 * @return LocalDate
	 * @since 1.0.0
	 */
	public static LocalDate stringToLocalDate(String time, String format) {
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
		LocalDate date = LocalDate.from(formatter.parse(time));
		return date;
	}

	/**
	 * 
	 * Description 字符串日期+时间转LocalDateTime <br>
	 * Date 2019-03-30 17:50:42<br>
	 * 
	 * @param time
	 * @param format
	 * @return LocalDateTime
	 * @since 1.0.0
	 */
	public static LocalDateTime stringToLocalDateTime(String time, String format) {
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
		LocalDateTime dateTime = LocalDateTime.from(formatter.parse(time));
		return dateTime;
	}

	/**
	 * 
	 * Description 格式化日期时间 <br>
	 * Date 2019-03-30 17:50:54<br>
	 * 
	 * @param dateTime
	 * @param format
	 * @return String
	 * @since 1.0.0
	 */
	public static String format(LocalDateTime dateTime, String format) {
		return DateTimeFormatter.ofPattern(format).format(dateTime);
	}

	/**
	 * 
	 * Description 格式化日期 <br>
	 * Date 2019-03-30 17:51:03<br>
	 * 
	 * @param date
	 * @param format
	 * @return String
	 * @since 1.0.0
	 */
	public static String format(LocalDate date, String format) {
		return DateTimeFormatter.ofPattern(format).format(date);
	}

	/**
	 * 
	 * Description 获取指定天数后的时间 <br>
	 * Date 2019-03-30 17:51:18<br>
	 * 
	 * @param days
	 * @return LocalDateTime
	 * @since 1.0.0
	 */
	public static LocalDateTime getAddDays(long days) {
		LocalDateTime dateTime = LocalDateTime.now().plusDays(days);
		return dateTime;
	}

	/**
	 * 
	 * Description 时间戳转日期 <br>
	 * Date 2019-03-30 18:15:12<br>
	 * 
	 * @param timestamp
	 * @return LocalDateTime
	 * @since 1.0.0
	 */
	public static LocalDateTime timestampToLocalDateTime(long timestamp) {
		LocalDateTime dateTime = Instant.ofEpochMilli(timestamp).atZone(ZoneId.systemDefault()).toLocalDateTime();
		return dateTime;
	}

	/**
	 * 
	 * Description 大部分时间格式转yyyy-MM-dd HH:mm:ss <br>
	 * Date 2019-03-30 17:58:19<br>
	 * 
	 * @param text
	 * @return String
	 * @since 1.0.0
	 */
	public static String allToDateTime(String text) {
		if (null != text) {
			// 格式全部转化成-间隔
			text = text.replaceAll("[/\\.]", "-");
			String matches = "\\d{4}";
			if (text.matches(matches)) {
				// 只有年份，补全月日时分秒
				text += "-01-01 00:00:00";
			} else if (text.matches("\\d{4}-\\d{1,2}")) {
				// 只有年月，补全日时分秒
				text += "-01 00:00:00";
			} else if (text.matches("\\d{4}-\\d{1,2}-\\d{1,2}")) {
				// 只有年月日，补全时分秒
				text += " 00:00:00";
			} else if (text.matches("\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}")) {
				// 只有年月日时，补全分秒
				text += ":00:00";
			} else if (text.matches("\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}")) {
				// 只有年月日时分，补全秒
				text += ":00";
			}
		}
		return text;
	}

	/**
	 * 
	 * Description 大部分时间格式转yyyy-MM-dd HH:mm:ss.SSS <br>
	 * Date 2019-03-30 17:58:19<br>
	 * 
	 * @param text
	 * @return String
	 * @since 1.0.0
	 */
	public static String allToDateTimeMillisecond(String text) {
		if (null != text) {
			// 格式全部转化成-间隔
			text = text.replaceAll("[/\\.]", "-");
			String matches = "\\d{4}";
			if (text.matches(matches)) {
				// 只有年份，补全月日时分秒
				text += "-01-01 00:00:00.000";
			} else if (text.matches("\\d{4}-\\d{1,2}")) {
				// 只有年月，补全日时分秒
				text += "-01 00:00:00.000";
			} else if (text.matches("\\d{4}-\\d{1,2}-\\d{1,2}")) {
				// 只有年月日，补全时分秒
				text += " 00:00:00.000";
			} else if (text.matches("\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}")) {
				// 只有年月日时，补全分秒
				text += ":00:00.000";
			} else if (text.matches("\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}")) {
				// 只有年月日时分，补全秒
				text += ":00.000";
			} else if (text.matches("\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}")) {
				// 只有年月日时分秒，补全毫秒秒
				text += ".000";
			}
		}
		return text;
	}
}
